SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[spEjecutarReubicaciones]
@idReubicacion Int
AS
SET NOCOUNT ON
Set Dateformat DMY

Declare @Titulares Int
Declare @Interinos Int
Declare @Horas Int
Declare @AdmiteSuplentes Varchar(1)
Declare @RegimenSuplencias Int
Declare @SituacionRevista Int
Declare @PresupuestoDestino Int
Declare @PresupuestoOrigen Int
Declare @Error Int
Declare @MensajeError Varchar(300)
Declare @CupofDestino Varchar(80)
Declare @CupofOrigen Varchar(80)
Declare @FechaAltaServicio Datetime

Declare @idMovimiento Int, @Servicio Int, @SubServicio Int, @Fecha Datetime, @PlazaOrigen Int, @PlazaDestino Int, @SituacionRevistaDelAgente Int
		
Declare Movimientos Cursor For
	Select idMovimientoDeReubicacion, Servicio, idSubServicio, Fecha, PlazaOrigen, PlazaDestino
	From tb_MovimientosDeReubicacion Where Reubicacion = @idReubicacion And Ejecutado <> 'S'

Open Movimientos 

Fetch Next From Movimientos Into @idMovimiento, @Servicio, @SubServicio, @Fecha, @PlazaOrigen, @PlazaDestino

Select @CupofOrigen = Cupof From tb_Plazas Where idPlaza = @PlazaOrigen
Select @CupofDestino = Cupof From tb_Plazas Where idPlaza = @PlazaDestino
Select @Error = 0
Select @MensajeError = 'ERROR! '

While @@Fetch_Status = 0
Begin
	Print 'Paso 1'
	--CHECK1: Las plazas destino y origen deben tener el mismo cargo funcional (Funcion)
	If (Select Funcion From tb_Plazas Where idPlaza = @PlazaOrigen) <> (Select Funcion From tb_Plazas Where idPlaza = @PlazaDestino)
	Begin
		Print 'Error de funcion'
		Update tb_MovimientosDeReubicacion Set Error = 'Distinta Funcion entre Origen y Destino' Where idMovimientoDeReubicacion = @idMovimiento
		Select @Error = 1
		Select @MensajeError = @MensajeError + ' \n Distinta Funcion entre Origen ('+@CupofOrigen+') y Destino ('+@CupofDestino+')' 
	End

	--CHECK2: No deben quedar mas de un interino o titular en la plaza destino.

	Select @SituacionRevistaDelAgente = SituacionRevista From tb_ServiciosAgentes Where idServicioAgente = @Servicio	

	Select @Interinos = Count(distinct idServicioAgente) From tb_ServiciosAgentes S -- Cuenta Interinos cuyos agentes no esten en un movimiento de reubicacion.
		Inner Join tb_SubServiciosAgentes SS On idServicioAgente = ServicioAgente
		Inner Join tb_Plazas P On idPlaza = Plaza		
		Where SS.FechaBaja Is Null And idPlaza = @PlazaDestino And SituacionRevista = 2
		And Agente Not In (Select Agente From tb_MovimientosDeReubicacion Where Reubicacion = @idReubicacion 
			And idMovimientoDeReubicacion <> @idMovimiento)

	If @Interinos Is Null
		Select @Interinos = 0

	Select @Titulares = Count(distinct idServicioAgente) From tb_ServiciosAgentes S  -- Cuenta Titulares cuyos agentes no esten en un movimiento de reubicacion.
		Inner Join tb_SubServiciosAgentes SS On idServicioAgente = ServicioAgente
		Inner Join tb_Plazas P On idPlaza = Plaza		
		Where SS.FechaBaja Is Null And idPlaza = @PlazaDestino And SituacionRevista = 1
		And Agente Not In (Select Agente From tb_MovimientosDeReubicacion Where Reubicacion = @idReubicacion 
			And idMovimientoDeReubicacion <> @idMovimiento)

	If @Titulares Is Null
		Select @Titulares = 0

	If @Interinos > 0 And @SituacionRevistaDelAgente In (1,2)
	Begin
		Print 'Error de situacion de revista'
		Update tb_MovimientosDeReubicacion Set Error = 'En la plaza destino habrá mas de un interino' Where idMovimientoDeReubicacion = @idMovimiento
		Select @Error = 1
		Select @MensajeError =  @MensajeError + '\n En la plaza destino ('+@CupofDestino+') habrá mas de un interino'
	End	

	If @Titulares > 0 And @SituacionRevistaDelAgente In (1,2)
	Begin
		Print 'Error de situacino de revista titular'
		Update tb_MovimientosDeReubicacion Set Error = 'En la plaza destino habrá mas de un titular' Where idMovimientoDeReubicacion = @idMovimiento
		Select @Error = 1
		Select @MensajeError = @MensajeError + '\n En la plaza destino ('+@CupofDestino+') habrá mas de un titular'
	End

	-- CHECK3: La situacion de revista del agente que reubica es Suplente o Funcional y la plaza destino no admite suplentes
	Select @SituacionRevista = SituacionRevista From tb_ServiciosAgentes, tb_SubServiciosAgentes Where idServicioAgente = ServicioAgente And idSubServicio = @SubServicio
	Select @RegimenSuplencias = RegimenSuplencias From tb_Plazas Where idPlaza = @PlazaDestino

	If @SituacionRevista in (4,5) And @RegimenSuplencias = 13 
	Begin
		Print 'Regimen de suplencias'
		Update tb_MovimientosDeReubicacion Set Error = 'Plaza destino no admite suplentes' Where idMovimientoDeReubicacion = @idMovimiento
		Select @Error = 1
		Select @MensajeError = @MensajeError + '\n Plaza destino ('+@CupofDestino+') no admite suplentes' 
	End

	-- CHECK4: Las plazas destino y origen deben tener el mismo aval presupestario
	Select @PresupuestoOrigen = Presupuesto From tb_Plazas Where idPlaza = @PlazaOrigen
	Select @PresupuestoDestino = Presupuesto From tb_Plazas Where idPlaza = @PlazaDestino

	If @PresupuestoDestino <> @PresupuestoOrigen  
	Begin
		Print 'Distintos presupuestos'
		Update tb_MovimientosDeReubicacion Set Error = 'Plaza Destino y Origen con distintos Presupuestos' Where idMovimientoDeReubicacion = @idMovimiento
		Select @Error = 1
		Select @MensajeError = @MensajeError + '\n Plaza Destino ('+@CupofDestino+') y Origen ('+@CupofOrigen+') con distintos Presupuestos'
	End

	--CHECK 5:  Que el movimiento sea posterior a la fecha de alta del servicio
	If @Fecha < @FechaAltaServicio
	Begin
		Print 'Error de fecha'
		Update tb_MovimientosDeReubicacion Set Error = 'La fecha del movimiento es anterior a la fecha de alta del servicio' Where idMovimientoDeReubicacion = @idMovimiento
		Select @Error = 1
		Select @MensajeError = @MensajeError + '\n La fecha del movimiento es anterior a la fecha de alta del servicio'
	End

	-- Si no se registro ningun error
	If @Error = 0
	Begin
		Print 'Se ejecuta el movimiento'
		Exec spEjecutarMovimientoDeReubicacion @idMovimiento		
	End

	Fetch Next From Movimientos Into @idMovimiento, @Servicio, @SubServicio, @Fecha, @PlazaOrigen, @PlazaDestino
End

If Not Exists(Select * From tb_MovimientosDeReubicacion Where Reubicacion = @idReubicacion And (Ejecutado Is Null Or Ejecutado = 'N'))
	Update tb_Reubicaciones Set Estado = 2 Where idReubicacion = @idReubicacion

Close Movimientos
Deallocate Movimientos

Select @Error Error
GO
